import os
import re
import shutil
import warnings

from  PyInstaller.__main__ import run
import sys

def doPackFun_CMD(entry_file,add_data:str="",spec:bool=False):
    """
    将python程序打包为可执行exe文件(废弃方法)
    :param entry_file: 入口py文件
    :param add_data: 添加额外打包文件路径
    :param spec: 是否spec方式，需要根目录下存在同名spec文件
    :return:
    """
    warnings.warn("该方法由于调用系统CMD，对系统依赖性过高，已废弃",DeprecationWarning, stacklevel=2)
    def removeFolders(folders:str):
        for folder in folders:
            if os.path.isdir(folder) and os.path.exists(folder):
                shutil.rmtree(folder)
    removeFolders(["build","dist"])
    nowpath=os.path.abspath(".")
    disk=os.path.splitdrive(nowpath)[0]
    cmdpath=os.path.join(os.environ["SystemRoot"],"System32","cmd.exe")
    conda_name=os.path.split(sys.exec_prefix)[1]
    entry_file=os.path.abspath(entry_file)
    entry_file_name=os.path.split(entry_file)[1]
    entry_file_name_no_ext=os.path.splitext(entry_file_name)[0]
    spec_file=os.path.join(nowpath,entry_file_name_no_ext+".spec")
    if spec:
        if os.path.exists(spec_file):
            cmd_total="{} /c {}&&cd {}&&{}&&{}" \
                .format(cmdpath,
                        disk,
                        nowpath,
                        "activate %s"%conda_name,
                        "pyinstaller %s"%(spec_file))

        else:
            warnings.warn(spec_file+"文件不存在，无法打包")
    else:
        if add_data=="":
            cmd_total="{} /c {}&&cd {}&&{}&&{}" \
                .format(cmdpath,
                        disk,
                        nowpath,
                        "activate %s"%conda_name,
                        "pyinstaller -F %s -p %s"%(entry_file,nowpath))
        else:
            cmd_total="{} /c {}&&cd {}&&{}&&{}" \
                .format(cmdpath,
                        disk,
                        nowpath,
                        "activate %s"%conda_name,
                        "pyinstaller -F %s -p %s --add-data %s"%(entry_file,nowpath,add_data))

    os.system(cmd_total)
    # print("打包文件已保存到：%s"%os.path.join(nowpath,"dist","%s.exe"%entry_file_name_no_ext))
def doPackFun(entry_file,add_data:str="",spec:bool=False):
    """
    将python程序打包为可执行exe文件
    :param entry_file: 入口py文件
    :param add_data: 添加额外打包文件路径
    :param spec: 是否spec方式，需要根目录下存在同名spec文件
    :return:
    """
    def removeFolders(folders:str):
        for folder in folders:
            if os.path.isdir(folder) and os.path.exists(folder):
                shutil.rmtree(folder)
    removeFolders(["build","dist"])
    nowpath=os.path.abspath(".")
    entry_file=os.path.abspath(entry_file)
    entry_file_name=os.path.split(entry_file)[1]
    entry_file_name_no_ext=os.path.splitext(entry_file_name)[0]
    spec_file=os.path.join(nowpath,entry_file_name_no_ext+".spec")
    if spec:
        if os.path.exists(spec_file):
            run(re.split(r"[ ]+",spec_file))
        else:
            warnings.warn(spec_file+"文件不存在，无法打包")
    else:
        if add_data=="":
            run(re.split(r"[ ]+","-F %s -p %s"%(entry_file,nowpath)))
        else:
            run(re.split(r"[ ]+","-F %s -p %s --add-data %s"%(entry_file,nowpath,add_data)))
if __name__=="__main__":
    doPackFun(os.path.join("src","hostsUpdater.py"),True)